
#ifndef _JEU_H
#define _JEU_H

/**
 * @file Jeu.h
 * @brief Contient la structure Jeu et ses fonctions
 * @details liste des fonctions pour le module Jeu
 * @version 1.0
 * @date 2013/05/16
*/
#include "Joueur.h"
#include "Plateau.h"
#include "listeCarte.h"


/**
 * @struct Jeu structure jeu
 * @brief Structure Jeu
 * @details	la structure contient: un Plateau, un Joueur, une Pioche , un Bonus, et un Des.
 * @param plat le plateau du jeu
 * @param jou le joueur
 * @param des le des a lancer
*/
typedef struct
{
    Plateau * plat;
    Joueur * jou;
    Pioche * pio;
	Bonus * bo;
    Des des;
    int nbrJ;
}Jeu;

/**
 * @brief jeuInit fais appel a creerPlateau et initJoueur avec le bon nombre de joueurs , crée une pioche et alloue un Bonus.
 * @param [in-out] Jeu* pointeur sur structure Jeu.
 * @param [in] nbrJ le nombre de joueurs.
 * @return none
*/
void jeuInit(Jeu *, const int);
/**
 * @brief jeuLibere detruit le plateau ,le bonus , et la pioche .et libere le joueur et le des .
 * @param [in-out] Jeu* le jeu a liberer. 
 * @return none
*/
void jeuLibere(Jeu *);
/**
 * @brief creerJeu alloue un jeu et fais appel a jeuInit.
 * @param [in] nbj le nombre de joueur.
 * @return Jeu * le jeu crée.
*/
Jeu * creerJeu(const int);
/**
 * @brief detruitJeu fais appel a jeuLibere et met le pointeur a NULL.
 * @param [in] Jeu** le jeu a detruire.
 * @return none
*/
void detruitJeu(Jeu **);
/**
 * @brief remplirJeu charge les questions, cartes et bonus depuis des fichiers txt et remplis le plateau.
 * @param [in-out] Jeu* pointeur sur structure Jeu.
 * @param [in] nbrJ le nombre de joueurs.
 * @return none
*/
void remplirJeu(Jeu *, const int);

/**
 * @brief getJoueur retourne le joueur dont l'indice est passé en paramètre.
 * @param [in] Jeu* pointeur sur structure Jeu.
 * @param [in] numJ l'indice du  joueur.
 * @return Joueur pointeur du joueur.
*/
Joueur * getJoueur(const Jeu *, const int);
/**
 * @brief joueurUnTour verifie si le joueur a effectuer le tour du plateau
 * @param [in-out] Jeu* pointeur sur structure Jeu.
 * @param [in] i l'indice du  joueur.
 * @return int valeur obtenu par Des.
*/
int joueurUnTour(Jeu *, const int);
/**
 * @brief testFinJeu vérifie la position et le score du joueur sur le plateau .
 * @param [in] Jeu* pointeur sur structure Jeu.
 * @return bool 0 si la partie est finie 1 sinon.
*/
int testFinJeu(const Jeu *);
/**
 * @brief testRegressionJeu fais appel a toutes les fonctions du module Jeu et effectue des Tests.
 * @return void
*/
void testRegressionJeu();

#endif
